package org.ne.springboot.pojo;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import java.util.*;
import java.util.concurrent.*;
import java.util.function.Function;

/**
 *
 *
 * @author wey
 * 通用提示词处理器
 * 负责管理提示词模板、处理API请求和解析响应
 */

public class PromptProcessor {

    private Map<String, String> promptTemplates;
//    String translate_prompt =
//            "作为专业的论文审批教授，针对每句中文判断中文摘要的英文翻译是否准确，以严格JSON格式返回，除json内容外无其他内容，并且json内容外无标点，无数字，无字符，其中包含字段chinese_text为翻译不正确的中文原文内容,english_text为chinese_text对应的英文原文，msg字段用来表示翻译不正确的原因，ans字段表示纠正后的英文翻译";
    String reference_prompt = "你负责检查文献引用关系。请用中文检查以下文献引用关系。\n" +
            "\n" +
            "引用部分的正文: {{question}}\n" +
            "参考文献列表: {{text}}\n" +
            "\n" +
            "采用适度宽松的标准,检查规则：\n" +
            "1. **引用标记解析**：从正文列表开头提取所有方括号内的数字引用标记，如[num]。每个标记代表一个引用序号。\n" +
            "2. **引用存在性检查**：对于每个引用标记[num]，检查参考文献列表中是否有序号[num]的条目。如果没有，则[num]计入缺失参考文献。\n" +
            "3. **格式检查**：引用标记格式基本正确——应有方括号和数字（数字应为正整数）。格式错误包括：缺少方括号、非数字字符、数字超出范围等。但允许小错误，如空格或大小写问题，只要可识别即可。\n" +
            "4. **内容相关性检查**：引用标记对应的段落文本应与参考文献条目的内容相关。基于标题、关键词或主题进行判断，允许部分匹配（例如，段落讨论MySQL，参考文献标题包含“MySQL”即视为相关）。完全不相关的情况才计入内容不匹配。\n" +
            "5. **未引用文献检查**：检查参考文献列表中是否有条目未被任何正文部分或正文列表的引用标记引用。如果有，列出这些未引用的参考文献编号。\n" +
            "6. **一一对应序号**：仅检查正文中实际出现的引用标记序号与参考文献列表序号的对应关系，要求参考文献列表连续或完整。\n" +
            "\n" +
            "请以严格的JSON格式返回结果，包含以下字段：\n" +
            "- correct_citations: 正确引用的数量（整数，表示引用标记存在、格式正确、内容相关的引用数量）\n" +
            "- missing_references: 缺失的参考文献编号列表（数组，包含所有在参考文献列表中无对应条目的引用标记序号）\n" +
            "- format_errors: 格式错误的引用编号列表（数组，包含所有格式错误的引用标记序号，如无效格式）\n" +
            "- content_mismatches: 内容完全不相关的引用编号列表（数组，包含所有段落文本与参考文献内容无任何关联的引用标记序号）\n" +
            "- unused_references: 未被引用的参考文献编号列表（数组，包含参考文献列表中有但未被任何引用标记引用的条目序号）\n" +
            "- issues: 问题列表（数组，每个元素是一个对象，包含以下字段：\n" +
            "  - type: 问题类型（字符串，如\"格式错误\"、\"内容不匹配\"、\"缺失引用\"、\"未引用文献\"）\n" +
            "  - description: 详细的中文问题描述\n" +
            "\n" +
            "{{format}}" +
            "请保证JSON格式没有空值：所有字段都必须存在，对于数字字段使用0，对于列表字段使用空数组[]。不要包含JSON内容外的任何文字、标点、数字或字符。";

    public PromptProcessor() {
        this.promptTemplates = new ConcurrentHashMap<>();
        // 默认提示词模板
        addPromptTemplate("default",
                "你是一个助手，必须以严格的json格式输出结果，下面是我的问题 '{{question}}'，接下来是我给出的内容 '{{text}}' " +
                        "请你根据我提出的问题以及我给出的内容，解决我的问题，输出格式要求: {{format}} " +
                        "严格遵守以下规则：\n" +
                        "1. 直接输出JSON，不要添加任何前缀或后缀。\n" +
                        "2. 不要解释分析过程，仅返回结构化数据。\n" +
                        "3. 如果文本无错误，所有字段需完整填充。\n" +
                        "4. 确保JSON格式完全正确（包括引号、括号匹配）。");
        addPromptTemplate("reference", reference_prompt);
    }

    /**
     * 添加或更新提示词模板
     */
    public void addPromptTemplate(String templateName, String template) {
        promptTemplates.put(templateName, template);
    }


    /**
     * 构建提示词
     */
    public String buildPrompt(String templateName, String question,
                               String content, Map<String, Object> formatConfig) {
        String template = promptTemplates.getOrDefault(templateName, promptTemplates.get("default"));

        // 构建格式要求
        String formatStr = buildFormatString(formatConfig);

        // 替换变量
        return template.replace("{{question}}", question)
                .replace("{{text}}", content)
                .replace("{{format}}", formatStr);
    }

    /**
     * 默认构建格式字符串
     */
    private String buildFormatString(Map<String, Object> formatConfig) {
        // 默认格式
        if (formatConfig.isEmpty()) {
            return "{" +
                    "\"content\": " +
                    "{\"有无语法错误\": \"有或无\"," +
                    "\"语法错误位置\": \"...\"," +
                    "\"语法错误类型\": \"...\"," +
                    "\"内容修改建议\": \"...\"," +
                    "\"改进完整文本\": \"...\"," +
                    "\"问题解决方法\": \"...\"}" +
                    "}";
        }

        // 根据配置动态生成格式
        try {
            return JSON.toJSONString(formatConfig);
        } catch (Exception e) {
            return "{\"error\": \"格式配置不正确\"}";
        }
    }


}